const { app, BrowserWindow, ipcMain, dialog, Menu, webContents } = require('electron')

const path = require('node:path')

const createWindow = () => {
    // 构建一个窗口
    const win = new BrowserWindow({
        width: 1000,
        height: 800,
        webPreferences: {
            preload: path.join(__dirname, 'preload.js')
            // // 一般情况下不会这么做
            // // 以下这俩打开之后，渲染进程可以使用nodejs了
            // nodeIntegration: true, // 集成node
            // contextIsolation: false // 默认隔离掉了node
        }
    })
    // 【监听】渲染进程，主进程返回'pong'
    ipcMain.handle('ping', () => 'pong')


    // 为网页设置标题
    // 在主进程中，通过 API ipcmain.on 在 set-title 通道上设置一个 IPC 【监听】器：
    ipcMain.on('set-title', (event, title) => {
        const webContents = event.sender
        const win = BrowserWindow.fromWebContents(webContents)
        win.setTitle(title)
    })

    
    async function handleFileOpen() {
        const { canceled, filePaths } = await dialog.showOpenDialog()
        if (!canceled) {
            return filePaths
        }
    }
    // IPC 通道名称上的 dialog: 前缀对代码没有影响。 它仅用作命名空间以帮助提高代码的可读性。
    // 【监听】渲染进程，主进程打开文件
    ipcMain.handle('dialog:openFile', handleFileOpen)


    console.log(win.webContents);
    const menu = Menu.buildFromTemplate([
        {
            label: app.name,
            submenu: [
                {
                    // 主进程【发送】'update-counter'通道指令
                    click: () => win.webContents.send('update-counter', 1),
                    label: '添加'
                },
                {
                    // 主进程【发送】'update-counter'通道指令
                    click: () => win.webContents.send('update-counter', -1),
                    label: '减少'
                }
            ]
        }
    ])

    Menu.setApplicationMenu(menu)

    // 主进程【监听】'counter-value'通道指令
    ipcMain.on('counter-value', (event, value) => {
        console.log(value)
    })

    win.loadFile('index.html')
    // 临时打开调试窗口
    win.webContents.openDevTools()

    // 关闭警告
    // process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'
}

app.on('will-finish-launching', () => {
    console.log('will-finish-launching');
})

app.on('ready', () => {
    console.log('ready');
})
// 窗口就绪，返回一个Promise
app.whenReady().then(() => {
    console.log('whenReady')

    createWindow()
    console.log(webContents.getAllWebContents());

    // 当应用被激活时发出。 各种操作都可以触发此事件, 例如首次启动应用程序、尝试在应用程序已运行时或单击应用程序的坞站或任务栏图标时重新激活它。
    app.on('activate', () => {
        console.log('activate')
        if (BrowserWindow.getAllWindows().length === 0) {
            createWindow()
        }
    })
})

app.on('before-quit', () => {
    console.log('before-quit');
})

app.on('will-quit', () => {
    console.log('will-quit');
})

app.on('quit', () => {
    console.log('quit');
})

app.on('window-all-closed', () => {
    console.log('window-all-closed');
    // process 主进程
    if (process.platform !== 'darwin') {
        app.quit()
    }
})

/**
 *  will-finish-launching
    ready
    whenReady
    window-all-closed
    before-quit
    will-quit
    quit
 */

/**
 * 主进程(Main Process) nodejs 干事 
 * 渲染进程
 * 主进程和渲染进程 IPC通信
 */

